import * as vscode from 'vscode';
import {dedent} from "../../../utils";

// documentation中使用了代码块，代码块中写的事makedown格式，首行不能为空
let funItems = [
    {
        "label": "LoadExport",
        "insertText": dedent`
        GUI:LoadExport(\${1:parent}, \${2:filename})
        `,
        "documentation": dedent`# 加载UI文件
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数     | 必选 | 类型   | 注释       |
        | :------- | :--- | :----- | :--------- |
        | parent   | 是   | obj    | 父节点对象 |
        | filename | 是   | string | 文件路径   |

        Ctrl+f9 界面编辑器导出的lua文件

        简单示例

        local win = GUI:Win_Create("Win_1", 0, 0, 1136, 640)
        GUI:LoadExport(win, "game_world_confirm")
        -- ...

        `
    },
    {
        "label": "ui_delegate",
        "insertText": dedent`
        GUI:ui_delegate(\${1:parent})
        `,
        "documentation": dedent`# 获取父节点的快捷子控件组
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        返回值 : table [key 为控件名]

        示例

        local ui = GUI:ui_delegate(parent)
        if ui.Text_attName then
            GUI:Text_setString(ui.Text_attName, "------")
        end

        `
    },
    {
        "label": "DisableFixPosition",
        "insertText": dedent`
        GUI:DisableFixPosition()
        `,
        "documentation": dedent`# 屏蔽自动修复坐标为整数
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:DisableFixPosition()

        `
    },
    {
        "label": "Attach_Parent",
        "insertText": dedent`
        GUI:Attach_Parent()
        `,
        "documentation": dedent`# 获取当前打开界面挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_Parent()

        `
    },
    {
        "label": "Attach_LeftTop",
        "insertText": dedent`
        GUI:Attach_LeftTop()
        `,
        "documentation": dedent`# 获取主界面左上挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_LeftTop()

        `
    },
    {
        "label": "Attach_RightTop",
        "insertText": dedent`
        GUI:Attach_RightTop()
        `,
        "documentation": dedent`# 获取主界面右上挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_RightTop()

        `
    },
    {
        "label": "Attach_LeftBottom",
        "insertText": dedent`
        GUI:Attach_LeftBottom()
        `,
        "documentation": dedent`# 获取主界面左下挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_LeftBottom()

        `
    },
    {
        "label": "Attach_RightBottom",
        "insertText": dedent`
        GUI:Attach_RightBottom()
        `,
        "documentation": dedent`# 获取主界面右下挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_RightBottom()

        `
    },
    {
        "label": "Attach_UITop",
        "insertText": dedent`
        GUI:Attach_UITop()
        `,
        "documentation": dedent`# 获取最上层UI挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_UITop()

        `
    },
    {
        "label": "Attach_SceneF",
        "insertText": dedent`
        GUI:Attach_SceneF()
        `,
        "documentation": dedent`# 获取上层场景挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_SceneF()

        `
    },
    {
        "label": "Attach_SceneB",
        "insertText": dedent`
        GUI:Attach_SceneB()
        `,
        "documentation": dedent`# 获取下层场景挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_SceneB()

        `
    },
    {
        "label": "Attach_LeftTop_B",
        "insertText": dedent`
        GUI:Attach_LeftTop_B()
        `,
        "documentation": dedent`# 获取主界面最底层左上挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_LeftTop_B()

        `
    },
    {
        "label": "Attach_RightTop_B",
        "insertText": dedent`
        GUI:Attach_RightTop_B()
        `,
        "documentation": dedent`# 获取主界面最底层右上挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_RightTop_B()

        `
    },
    {
        "label": "Attach_LeftBottom_B",
        "insertText": dedent`
        GUI:Attach_LeftBottom_B()
        `,
        "documentation": dedent`# 获取主界面最底层左下挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_LeftBottom_B()

        `
    },
    {
        "label": "Attach_RightBottom_B",
        "insertText": dedent`
        GUI:Attach_RightBottom_B()
        `,
        "documentation": dedent`# 获取主界面最底层右下挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_RightBottom_B()

        `
    },
    {
        "label": "Attach_LeftTop_T",
        "insertText": dedent`
        GUI:Attach_LeftTop_T()
        `,
        "documentation": dedent`# 获取主界面最顶层左上挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_LeftTop_T()

        `
    },
    {
        "label": "Attach_RightTop_T",
        "insertText": dedent`
        GUI:Attach_RightTop_T()
        `,
        "documentation": dedent`# 获取主界面最顶层右上挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_RightTop_T()

        `
    },
    {
        "label": "Attach_LeftBottom_T",
        "insertText": dedent`
        GUI:Attach_LeftBottom_T()
        `,
        "documentation": dedent`# 获取主界面最顶层左下挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_LeftBottom_T()

        `
    },
    {
        "label": "Attach_RightBottom_T",
        "insertText": dedent`
        GUI:Attach_RightBottom_T()
        `,
        "documentation": dedent`# 获取主界面最顶层右下挂接点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Attach_RightBottom_T()

        `
    },
    {
        "label": "Win_FindParent",
        "insertText": dedent`
        GUI:Win_FindParent(\${1:ID})
        `,
        "documentation": dedent`# 获取自带父节点 [挂接点ID: 101-111]
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        GUI:Win_FindParent(\${1:ID})

        `
    },
    {
        "label": "setPosition",
        "insertText": dedent`
        GUI:setPosition(\${1:widget}, \${2:x}, \${3:y})
        `,
        "documentation": dedent`# 设置坐标
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |
        | x      | 是   | int  | 横坐标   |
        | y      | 是   | int  | 纵坐标   |

        `
    },
    {
        "label": "getPosition",
        "insertText": dedent`
        GUI:getPosition(\${1:widget})
        `,
        "documentation": dedent`# 获取坐标
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        获取坐标

        local pos = GUI:getPosition(widget)
        SL:Print("x",pos.x)
        SL:Print("y",pos.y)

        `
    },
    {
        "label": "setPositionX",
        "insertText": dedent`
        GUI:setPositionX(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置横坐标（纵坐标不变）
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |
        | value  | 是   | int  | 横坐标   |

        `
    },
    {
        "label": "getPositionX",
        "insertText": dedent`
        GUI:getPositionX(\${1:widget})
        `,
        "documentation": dedent`# 获取横坐标
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "setPositionY",
        "insertText": dedent`
        GUI:setPositionY(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置纵坐标（横坐标不变）
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |
        | value  | 是   | int  | 纵坐标   |

        `
    },
    {
        "label": "getPositionY",
        "insertText": dedent`
        GUI:getPositionY(\${1:widget})
        `,
        "documentation": dedent`# 获取纵坐标
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "setAnchorPoint",
        "insertText": dedent`
        GUI:setAnchorPoint(\${1:widget}, \${2:x}, \${3:y})
        `,
        "documentation": dedent`# 设置控件锚点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |
        | x      | 是   | int  | 横坐标   |
        | y      | 是   | int  | 纵坐标   |

        示例代码

        GUI:setAnchorPoint(parent, 0, 0)        -- 左 下
        GUI:setAnchorPoint(parent, 0, 0.5)      -- 左 中
        GUI:setAnchorPoint(parent, 0, 1)        -- 左 上
        GUI:setAnchorPoint(parent, 0.5, 0)      -- 中 下
        GUI:setAnchorPoint(parent, 0.5, 0.5)    -- 中 中
        GUI:setAnchorPoint(parent, 0.5, 1)      -- 中 上
        GUI:setAnchorPoint(parent, 1, 0)        -- 右 下 
        GUI:setAnchorPoint(parent, 1, 0.5)      -- 右 中
        GUI:setAnchorPoint(parent, 1, 1)        -- 右 上

        `
    },
    {
        "label": "getAnchorPoint",
        "insertText": dedent`
        GUI:getAnchorPoint(\${1:widget})
        `,
        "documentation": dedent`# 获取控件锚点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "setContentSize",
        "insertText": dedent`
        GUI:setContentSize(\${1:widget}, \${2:sizeW}, \${3:sizeH})
        `,
        "documentation": dedent`# 设置控件尺寸大小
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |
        | sizeW  | 是   | int  | 宽度     |
        | sizeH  | 是   | int  | 长度     |

        `
    },
    {
        "label": "getContentSize",
        "insertText": dedent`
        GUI:getContentSize(\${1:widget})
        `,
        "documentation": dedent`# 获取控件尺寸大小(纹理大小 不考虑缩放)
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "getBoundingBox",
        "insertText": dedent`
        GUI:getBoundingBox(\${1:widget})
        `,
        "documentation": dedent`# 获取控件尺寸大小(考虑缩放的真实大小)
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "setIgnoreContentAdaptWithSize",
        "insertText": dedent`
        GUI:setIgnoreContentAdaptWithSize(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置忽略设置的自定义尺寸大小
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型    | 注释                     |
        | :----- | :--- | :------ | :----------------------- |
        | widget | 是   | obj     | 控件对象                 |
        | value  | 是   | boolean | 是否忽略用户定义尺寸大小 |

        `
    },
    {
        "label": "setTag",
        "insertText": dedent`
        GUI:setTag(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件标签
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |
        | value  | 是   | int  | 标签值   |

        `
    },
    {
        "label": "getTag",
        "insertText": dedent`
        GUI:getTag(\${1:widget})
        `,
        "documentation": dedent`# 获取控件标签
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "setName",
        "insertText": dedent`
        GUI:setName(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件名字
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型   | 注释     |
        | :----- | :--- | :----- | :------- |
        | widget | 是   | obj    | 控件对象 |
        | value  | 是   | string | 名字     |

        `
    },
    {
        "label": "setGrey",
        "insertText": dedent`
        GUI:setGrey(\${1:widget}, \${2:isGrey})
        `,
        "documentation": dedent`# 设置控件置灰
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |
        | isGrey | 是   | bool | 是否置灰 |

        `
    },
    {
        "label": "setRotation",
        "insertText": dedent`
        GUI:setRotation(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件旋转角度
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释                |
        | :----- | :--- | :--- | :------------------ |
        | widget | 是   | obj  | 控件对象            |
        | value  | 是   | int  | 旋转角度（0 - 360） |

        `
    },
    {
        "label": "getRotation",
        "insertText": dedent`
        GUI:getRotation(\${1:widget})
        `,
        "documentation": dedent`# 获取控件旋转角度
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "setRotationSkewX",
        "insertText": dedent`
        GUI:setRotationSkewX(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件X轴倾斜角度
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释                |
        | :----- | :--- | :--- | :------------------ |
        | widget | 是   | obj  | 控件对象            |
        | value  | 是   | int  | 倾斜角度（0 - 360） |

        `
    },
    {
        "label": "setRotationSkewY",
        "insertText": dedent`
        GUI:setRotationSkewY(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件Y轴倾斜角度
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释                |
        | :----- | :--- | :--- | :------------------ |
        | widget | 是   | obj  | 控件对象            |
        | value  | 是   | int  | 倾斜角度（0 - 360） |

        `
    },
    {
        "label": "setVisible",
        "insertText": dedent`
        GUI:setVisible(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件可见性
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |
        | value  | 是   | bool | 是否显示 |

        `
    },
    {
        "label": "getVisible",
        "insertText": dedent`
        GUI:getVisible(\${1:widget})
        `,
        "documentation": dedent`# 获取控件是否显示状态
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "setOpacity",
        "insertText": dedent`
        GUI:setOpacity(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件不透明度
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释                     |
        | :----- | :--- | :--- | :----------------------- |
        | widget | 是   | obj  | 控件对象                 |
        | value  | 是   | int  | 不透明度(0-255), 默认255 |

        `
    },
    {
        "label": "getOpacity",
        "insertText": dedent`
        GUI:getOpacity(\${1:widget})
        `,
        "documentation": dedent`# 获取控件不透明度
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "setScale",
        "insertText": dedent`
        GUI:setScale(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件缩放
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型  | 注释              |
        | :----- | :--- | :---- | :---------------- |
        | widget | 是   | obj   | 控件对象          |
        | value  | 是   | float | 缩放比例, 默认1.0 |

        `
    },
    {
        "label": "getScale",
        "insertText": dedent`
        GUI:getScale(\${1:widget})
        `,
        "documentation": dedent`# 获取控件缩放比例
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "setScaleX",
        "insertText": dedent`
        GUI:setScaleX(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件X轴方向缩放
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型  | 注释              |
        | :----- | :--- | :---- | :---------------- |
        | widget | 是   | obj   | 控件对象          |
        | value  | 是   | float | 缩放比例, 默认1.0 |

        `
    },
    {
        "label": "getScaleX",
        "insertText": dedent`
        GUI:getScaleX(\${1:widget})
        `,
        "documentation": dedent`# 获取控件X轴方向缩放比例
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "setScaleY",
        "insertText": dedent`
        GUI:setScaleY(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件Y轴方向缩放
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型  | 注释              |
        | :----- | :--- | :---- | :---------------- |
        | widget | 是   | obj   | 控件对象          |
        | value  | 是   | float | 缩放比例, 默认1.0 |

        `
    },
    {
        "label": "getScaleY",
        "insertText": dedent`
        GUI:getScaleY(\${1:widget})
        `,
        "documentation": dedent`# 获取控件Y轴方向缩放比例
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "setFlippedX",
        "insertText": dedent`
        GUI:setFlippedX(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置水平X轴方向翻转
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释            |
        | :----- | :--- | :--- | :-------------- |
        | widget | 是   | obj  | 控件对象        |
        | value  | 是   | bool | X轴方向是否翻转 |

        `
    },
    {
        "label": "getFlippedX",
        "insertText": dedent`
        GUI:getFlippedX(\${1:widget})
        `,
        "documentation": dedent`# 获取是否水平翻转
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "setFlippedY",
        "insertText": dedent`
        GUI:setFlippedY(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 垂直Y轴方向翻转
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数  | 必选 | 类型 | 注释            |
        | :---- | :--- | :--- | :-------------- |
        | value | 是   | bool | Y轴方向是否翻转 |

        `
    },
    {
        "label": "getFlippedY",
        "insertText": dedent`
        GUI:getFlippedY(\${1:widget})
        `,
        "documentation": dedent`# 获取是否垂直翻转
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "setLocalZOrder",
        "insertText": dedent`
        GUI:setLocalZOrder(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件渲染层级
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释                       |
        | :----- | :--- | :--- | :------------------------- |
        | widget | 是   | obj  | 控件对象                   |
        | value  | 是   | int  | 渲染层级, 值越大显示越靠前 |

        `
    },
    {
        "label": "setCascadeOpacityEnabled",
        "insertText": dedent`
        GUI:setCascadeOpacityEnabled(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件是否跟随父控件变化透明度
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |
        | value  | 是   | bool | 是否跟随 |

        `
    },
    {
        "label": "setChildrenCascadeOpacityEnabled",
        "insertText": dedent`
        GUI:setChildrenCascadeOpacityEnabled(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件的所有子控件是否跟随变化透明度
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |
        | value  | 是   | bool | 是否跟随 |

        `
    },
    {
        "label": "getWorldPosition",
        "insertText": dedent`
        GUI:getWorldPosition(\${1:widget})
        `,
        "documentation": dedent`# 获得控件世界坐标
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "convertToWorldSpace",
        "insertText": dedent`
        GUI:convertToWorldSpace(\${1:widget}, \${2:x}, \${3:y})
        `,
        "documentation": dedent`# 对应控件的节点坐标转换为世界坐标
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释      |
        | :----- | :--- | :--- | :-------- |
        | widget | 是   | obj  | 控件对象  |
        | x      | 是   | int  | 节点坐标X |
        | y      | 是   | int  | 节点坐标Y |

        `
    },
    {
        "label": "convertToNodeSpace",
        "insertText": dedent`
        GUI:convertToNodeSpace(\${1:widget}, \${2:x}, \${3:y})
        `,
        "documentation": dedent`# 世界坐标转换为对应控件的节点坐标
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释      |
        | :----- | :--- | :--- | :-------- |
        | widget | 是   | obj  | 控件对象  |
        | x      | 是   | int  | 世界坐标X |
        | y      | 是   | int  | 世界坐标Y |

        `
    },
    {
        "label": "addChild",
        "insertText": dedent`
        GUI:addChild(\${1:widget}, \${2:child})
        `,
        "documentation": dedent`# 加载子控件
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释        |
        | :----- | :--- | :--- | :---------- |
        | widget | 是   | obj  | 父控件对象  |
        | child  | 是   | obj  | 子控件对象) |

        `
    },
    {
        "label": "addRef",
        "insertText": dedent`
        GUI:addRef(\${1:widget})
        `,
        "documentation": dedent`# 引用计数加1
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "decRef",
        "insertText": dedent`
        GUI:decRef(\${1:widget})
        `,
        "documentation": dedent`# 引用计数减1
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "autoDecRef",
        "insertText": dedent`
        GUI:autoDecRef(\${1:widget})
        `,
        "documentation": dedent`# 自动释放
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "setTouchEnabled",
        "insertText": dedent`
        GUI:setTouchEnabled(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件是否可以触摸
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |
        | value  | 是   | bool | 是否触摸 |

        `
    },
    {
        "label": "getTouchEnabled",
        "insertText": dedent`
        GUI:getTouchEnabled(\${1:widget})
        `,
        "documentation": dedent`# 获取控件是否可以触摸
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "delayTouchEnabled",
        "insertText": dedent`
        GUI:delayTouchEnabled(\${1:widget}, \${2:delay})
        `,
        "documentation": dedent`# 设置延迟可触摸
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型  | 注释         |
        | :----- | :--- | :---- | :----------- |
        | widget | 是   | obj   | 控件对象     |
        | delay  | 否   | float | 延迟触摸间隔 |

        `
    },
    {
        "label": "setMouseEnabled",
        "insertText": dedent`
        GUI:setMouseEnabled(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件是否可以鼠标触摸
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释         |
        | :----- | :--- | :--- | :----------- |
        | widget | 是   | obj  | 控件对象     |
        | value  | 是   | bool | 是否鼠标触摸 |

        `
    },
    {
        "label": "setSwallowTouches",
        "insertText": dedent`
        GUI:setSwallowTouches(\${1:widget}, \${2:value})
        `,
        "documentation": dedent`# 设置控件是否触摸吞噬
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释         |
        | :----- | :--- | :--- | :----------- |
        | widget | 是   | obj  | 控件对象     |
        | value  | 是   | bool | 是否触摸吞噬 |

        `
    },
    {
        "label": "getSwallowTouches",
        "insertText": dedent`
        GUI:getSwallowTouches(\${1:widget})
        `,
        "documentation": dedent`# 获取控件是否触摸吞噬
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "setMouseRSwallowTouches",
        "insertText": dedent`
        GUI:setMouseRSwallowTouches(\${1:widget})
        `,
        "documentation": dedent`# 设置控件吞噬鼠标按键事件 [检查自身触摸吞噬时]
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)
        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "getParent",
        "insertText": dedent`
        GUI:getParent(\${1:widget})
        `,
        "documentation": dedent`# 获取父节点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释       |
        | :----- | :--- | :--- | :--------- |
        | widget | 是   | obj  | 子控件对象 |

        `
    },
    {
        "label": "getChildren",
        "insertText": dedent`
        GUI:getChildren(\${1:widget})
        `,
        "documentation": dedent`# 获取控件所有子节点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释       |
        | :----- | :--- | :--- | :--------- |
        | widget | 是   | obj  | 父控件对象 |

        `
    },
    {
        "label": "getName",
        "insertText": dedent`
        GUI:getName(\${1:widget})
        `,
        "documentation": dedent`# 获取控件名字
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "getChildByName",
        "insertText": dedent`
        GUI:getChildByName(\${1:widget}, \${2:name})
        `,
        "documentation": dedent`# 通过控件名字获取子节点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型   | 注释       |
        | :----- | :--- | :----- | :--------- |
        | widget | 是   | obj    | 父控件对象 |
        | name   | 是   | string | 控件名字   |

        `
    },
    {
        "label": "getChildByTag",
        "insertText": dedent`
        GUI:getChildByTag(\${1:widget}, \${2:tag})
        `,
        "documentation": dedent`# 通过控件标记获取子节点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释       |
        | :----- | :--- | :--- | :--------- |
        | widget | 是   | obj  | 父控件对象 |
        | tag    | 是   | int  | 控件标记   |

        `
    },
    {
        "label": "removeAllChildren",
        "insertText": dedent`
        GUI:removeAllChildren(\${1:widget})
        `,
        "documentation": dedent`# 移除传入控件的所有子节点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "removeFromParent",
        "insertText": dedent`
        GUI:removeFromParent(\${1:widget})
        `,
        "documentation": dedent`# 将传入控件从父节点上移除
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "removeChildByName",
        "insertText": dedent`
        GUI:removeChildByName(\${1:widget}, \${2:name})
        `,
        "documentation": dedent`# 通过名字删除传入控件的对应子节点
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型   | 注释     |
        | :----- | :--- | :----- | :------- |
        | widget | 是   | obj    | 控件对象 |
        | name   | 是   | string | 控件名字 |

        `
    },
    {
        "label": "addOnClickEvent",
        "insertText": dedent`
        GUI:addOnClickEvent(\${1:widget}, \${2:func})
        `,
        "documentation": dedent`# 设置控件点击事件
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型     | 注释     |
        | :----- | :--- | :------- | :------- |
        | widget | 是   | obj      | 控件对象 |
        | func   | 是   | function | 回调函数 |

        `
    },
    {
        "label": "addOnTouchEvent",
        "insertText": dedent`
        GUI:addOnTouchEvent(\${1:widget}, \${2:func})
        `,
        "documentation": dedent`# 设置控件触摸事件
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型     | 注释     |
        | :----- | :--- | :------- | :------- |
        | widget | 是   | obj      | 控件对象 |
        | func   | 是   | function | 回调函数 |
        示例 1

        -- 添加长按事件, 长按0.5秒触发
        GUI:addOnTouchEvent(btn, function(sender, type)
        -- sender: 传入控件自身
        -- type: 触摸类型 int 0 - 3
        if type == SLDefine.TouchEventType.began then           -- 0 触摸开始
            if not sender._clicking then
                sender._clicking = true
                SL:scheduleOnce(sender, function()
                    sender._clicking = false
                    SL:Print("长按触发---")
                end, 0.5)
            end
        elseif type == SLDefine.TouchEventType.moved then       -- 1 触摸移动
        elseif type == SLDefine.TouchEventType.ended or type == SLDefine.TouchEventType.canceled then       -- 2 触摸结束 3 触摸取消
            if sender._clicking then
                GUI:stopAllActions(sender)
                sender._clicking = false
                SL:Print("单击触发---")
            end
        end
        end)
        示例 2

        -- 添加双击事件 0.3秒间隔
        local function doubleCallBack()
            SL:Print("双击触发---")
        end
        GUI:addOnTouchEvent(btn, function(sender, type)
        -- sender: 传入控件自身
        -- type: 触摸类型 int 0 - 3
        if type == SLDefine.TouchEventType.ended then       -- 2 触摸结束
            if doubleCallBack then -- 双击事件
                if not sender._lastClick then
                    sender._lastClick = true
                    sender._clickDelayHandler = SL:ScheduleOnce(function()
                        SL:Print("单击触发---")
                        sender._lastClick = nil
                    end, 0.3)
                else
                    if sender._clickDelayHandler then
                        SL:UnSchedule(sender._clickDelayHandler)
                        sender._clickDelayHandler = nil
                    end
                    -- 双击回调方法
                    if doubleCallBack then
                        doubleCallBack()
                    end
                    sender._lastClick = nil
                end 
            end
        end
        end)

        `
    },
    {
        "label": "getTouchBeganPosition",
        "insertText": dedent`
        GUI:getTouchBeganPosition(\${1:widget})
        `,
        "documentation": dedent`# 获取控件触摸开始时位置
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "getTouchMovePosition",
        "insertText": dedent`
        GUI:getTouchMovePosition(\${1:widget})
        `,
        "documentation": dedent`# 获取控件触摸移动时位置
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "getTouchEndPosition",
        "insertText": dedent`
        GUI:getTouchEndPosition(\${1:widget})
        `,
        "documentation": dedent`# 获取控件触摸结束时位置
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "addOnLongTouchEvent",
        "insertText": dedent`
        GUI:addOnLongTouchEvent(\${1:widget}, \${2:func})
        `,
        "documentation": dedent`# 设置控件长按触发事件
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型     | 注释     |
        | :----- | :--- | :------- | :------- |
        | widget | 是   | obj      | 控件对象 |
        | func   | 是   | function | 回调函数 |

        `
    },
    {
        "label": "addMouseMoveEvent",
        "insertText": dedent`
        GUI:addMouseMoveEvent(\${1:widget}, \${2:param})
        `,
        "documentation": dedent`# 设置控件鼠标进入/移出事件
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型  | 注释                                                         |
        | :----- | :--- | :---- | :----------------------------------------------------------- |
        | widget | 是   | obj   | 控件对象                                                     |
        | param  | 是   | table | onEnterFunc: function 鼠标进入回调函数 onLeaveFunc: function 鼠标移出回调函数 onInsideFunc: function 鼠标一直在内部回调函数 |

        示例:
        GUI:addMouseMoveEvent(button,
        {
            onEnterFunc = function()
                SL:Print("enter!")
            end,
            onLeaveFunc = function()
                SL:Print("leave!")
            end
        }
        )

        `
    },
    {
        "label": "addMouseButtonEvent",
        "insertText": dedent`
        GUI:addMouseButtonEvent(\${1:widget}, \${2:param})
        `,
        "documentation": dedent`# 设置鼠标按钮事件
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型  | 注释                                                         |
        | :----- | :--- | :---- | :----------------------------------------------------------- |
        | widget | 是   | obj   | 控件对象                                                     |
        | param  | 是   | table | onRightDownFunc: function 鼠标右键点击事件 OnRightUpFunc: function 鼠标右键松开事件 needTouchPos: boolean 需要传入鼠标触摸位置 OnScrollFunc: function 鼠标滚轮滚动事件[3.40.8版本新增] |

        示例:
        GUI:addMouseButtonEvent(btn, {onRightDownFunc = function()
            SL:Print("right!!!!") 
        end})

        `
    },
    {
        "label": "addMouseOverTips",
        "insertText": dedent`
        GUI:addMouseOverTips(\${1:widget}, \${2:str}, \${3:pos}, \${4:anr}, \${5:param})
        `,
        "documentation": dedent`# 设置鼠标经过控件显示文本
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型   | 注释                                                         |
        | :----- | :--- | :----- | :----------------------------------------------------------- |
        | widget | 是   | obj    | 控件对象                                                     |
        | str    | 是   | string | 文本                                                         |
        | pos    | 是   | table  | 位置                                                         |
        | anr    | 是   | table  | 锚点                                                         |
        | param  | 否   | table  | checkCallback: function 检查接触点是否能展示[函数传入参数: pos 返回: true / false ] |

        示例:
        local param = {
            checkCallback = function(touchPos)
                if touchPos and GUI:isClippingParentContainsPoint(Image_icon, touchPos) then
                    return true
                end
                return false
            end
        }
        GUI:addMouseOverTips(Image_icon, "DESC_____", nil, nil, param)

        `
    },
    {
        "label": "schedule",
        "insertText": dedent`
        GUI:schedule(\${1:widget}, \${2:callback}, \${3:delay})
        `,
        "documentation": dedent`# 开启定时器
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数     | 必选 | 类型     | 注释     |
        | :------- | :--- | :------- | :------- |
        | widget   | 是   | obj      | 控件对象 |
        | callback | 是   | function | 回调函数 |
        | delay    | 是   | int      | 时间间隔 |

        示例:
        local function showTime()
            print("倒计时ing")
        end
        GUI:schedule(node, showTime, 1)

        `
    },
    {
        "label": "unSchedule",
        "insertText": dedent`
        GUI:unSchedule(\${1:widget})
        `,
        "documentation": dedent`# 停止定时器
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型 | 注释     |
        | :----- | :--- | :--- | :------- |
        | widget | 是   | obj  | 控件对象 |

        `
    },
    {
        "label": "addKeyboardEvent",
        "insertText": dedent`
        GUI:addKeyboardEvent(\${1:codeKeys}, \${2:pressedCB}, \${3:releaseCB}, \${4:checkFullSort})
        `,
        "documentation": dedent`# 键盘监听事件
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        - 注册键盘监听(快捷键)

        | 参数          | 必选 | 类型           | 注释                                             |
        | :------------ | :--- | :------------- | :----------------------------------------------- |
        | codeKeys      | 是   | string / table | 要监听的键盘键key                                |
        | pressedCB     | 是   | function       | 按下回调                                         |
        | releaseCB     | 否   | function       | 松开回调                                         |
        | checkFullSort | 否   | boolean        | 兼容全顺序键盘key排列, 针对监听多键 [3.40.7版本] |

        - 键盘键key 如下 :

          "KEY_NONE",
          "KEY_PAUSE",
          "KEY_SCROLL_LOCK",
          "KEY_PRINT",
          "KEY_SYSREQ",
          "KEY_BREAK",
          "KEY_ESCAPE",
          "KEY_BACKSPACE",
          "KEY_TAB",
          "KEY_BACK_TAB",
          "KEY_RETURN",
          "KEY_CAPS_LOCK",
          "KEY_SHIFT",
          "KEY_RIGHT_SHIFT",
          "KEY_CTRL",
          "KEY_RIGHT_CTRL",
          "KEY_ALT",
          "KEY_RIGHT_ALT",
          "KEY_MENU",
          "KEY_HYPER",
          "KEY_INSERT",
          "KEY_HOME",
          "KEY_PG_UP",
          "KEY_DELETE",
          "KEY_END",
          "KEY_PG_DOWN",
          "KEY_LEFT_ARROW",
          "KEY_RIGHT_ARROW",
          "KEY_UP_ARROW",
          "KEY_DOWN_ARROW",
          "KEY_NUM_LOCK",
          "KEY_KP_PLUS",
          "KEY_KP_MINUS",
          "KEY_KP_MULTIPLY",
          "KEY_KP_DIVIDE",
          "KEY_KP_ENTER",
          "KEY_KP_HOME",
          "KEY_KP_UP",
          "KEY_KP_PG_UP",
          "KEY_KP_LEFT",
          "KEY_KP_FIVE",
          "KEY_KP_RIGHT",
          "KEY_KP_END",
          "KEY_KP_DOWN",
          "KEY_KP_PG_DOWN",
          "KEY_KP_INSERT",
          "KEY_KP_DELETE",
          "KEY_F1",
          "KEY_F2",
          "KEY_F3",
          "KEY_F4",
          "KEY_F5",
          "KEY_F6",
          "KEY_F7",
          "KEY_F8",
          "KEY_F9",
          "KEY_F10",
          "KEY_F11",
          "KEY_F12",
          "KEY_SPACE",
          "KEY_EXCLAM",
          "KEY_QUOTE",
          "KEY_NUMBER",
          "KEY_DOLLAR",
          "KEY_PERCENT",
          "KEY_CIRCUMFLEX",
          "KEY_AMPERSAND",
          "KEY_APOSTROPHE",
          "KEY_LEFT_PARENTHESIS",
          "KEY_RIGHT_PARENTHESIS",
          "KEY_ASTERISK",
          "KEY_PLUS",
          "KEY_COMMA",
          "KEY_MINUS",
          "KEY_PERIOD",
          "KEY_SLASH",
          "KEY_0",
          "KEY_1",
          "KEY_2",
          "KEY_3",
          "KEY_4",
          "KEY_5",
          "KEY_6",
          "KEY_7",
          "KEY_8",
          "KEY_9",
          "KEY_COLON",
          "KEY_SEMICOLON",
          "KEY_LESS_THAN",
          "KEY_EQUAL",
          "KEY_GREATER_THAN",
          "KEY_QUESTION",
          "KEY_AT",
          "KEY_CAPITAL_A",
          "KEY_CAPITAL_B",
          "KEY_CAPITAL_C",
          "KEY_CAPITAL_D",
          "KEY_CAPITAL_E",
          "KEY_CAPITAL_F",
          "KEY_CAPITAL_G",
          "KEY_CAPITAL_H",
          "KEY_CAPITAL_I",
          "KEY_CAPITAL_J",
          "KEY_CAPITAL_K",
          "KEY_CAPITAL_L",
          "KEY_CAPITAL_M",
          "KEY_CAPITAL_N",
          "KEY_CAPITAL_O",
          "KEY_CAPITAL_P",
          "KEY_CAPITAL_Q",
          "KEY_CAPITAL_R",
          "KEY_CAPITAL_S",
          "KEY_CAPITAL_T",
          "KEY_CAPITAL_U",
          "KEY_CAPITAL_V",
          "KEY_CAPITAL_W",
          "KEY_CAPITAL_X",
          "KEY_CAPITAL_Y",
          "KEY_CAPITAL_Z",
          "KEY_LEFT_BRACKET",
          "KEY_BACK_SLASH",
          "KEY_RIGHT_BRACKET",
          "KEY_UNDERSCORE",
          "KEY_GRAVE",
          "KEY_A",
          "KEY_B",
          "KEY_C",
          "KEY_D",
          "KEY_E",
          "KEY_F",
          "KEY_G",
          "KEY_H",
          "KEY_I",
          "KEY_J",
          "KEY_K",
          "KEY_L",
          "KEY_M",
          "KEY_N",
          "KEY_O",
          "KEY_P",
          "KEY_Q",
          "KEY_R",
          "KEY_S",
          "KEY_T",
          "KEY_U",
          "KEY_V",
          "KEY_W",
          "KEY_X",
          "KEY_Y",
          "KEY_Z",
          "KEY_LEFT_BRACE",
          "KEY_BAR",
          "KEY_RIGHT_BRACE",
          "KEY_TILDE",
          "KEY_EURO",
          "KEY_POUND",
          "KEY_YEN",
          "KEY_MIDDLE_DOT",
          "KEY_SEARCH",
          "KEY_DPAD_LEFT",
          "KEY_DPAD_RIGHT",
          "KEY_DPAD_UP",
          "KEY_DPAD_DOWN",
          "KEY_DPAD_CENTER",
          "KEY_ENTER",
          "KEY_PLAY",

        示例:
        local function pressedCB()
            SL:Print("Presss!!!!!!!!!!!!!!")
        end
        local function releaseCB()
            SL:Print("release!!!!!!!!!!!!!!")
        end

        GUI:addKeyboardEvent("KEY_F7", pressedCB, releaseCB)

        `
    },
    {
        "label": "removeKeyboardEvent",
        "insertText": dedent`
        GUI:removeKeyboardEvent(\${1:codeKeys})
        `,
        "documentation": dedent`# 移除键盘监听(快捷键)
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数     | 必选 | 类型           | 注释                  |
        | :------- | :--- | :------------- | :-------------------- |
        | codeKeys | 是   | string / table | 要移除监听的键盘键key |

        示例:
        GUI:removeKeyboardEvent("KEY_F7")

        `
    },
    {
        "label": "addStateEvent",
        "insertText": dedent`
        GUI:addStateEvent(\${1:widget}, \${2:func})
        `,
        "documentation": dedent`# 添加控件状态监听事件
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数   | 必选 | 类型     | 注释     |
        | :----- | :--- | :------- | :------- |
        | widget | 是   | obj      | 控件对象 |
        | func   | 是   | function | 回调函数 |

        eventName: 事件名
        "enter" : 控件加载
        "exit"  : 控件移除

        示例:
        local t = GUI:Image_Create(-1, "21", 500, 400, "res/private/npc/bg_zbhstips_01.png")
        GUI:addStateEvent(t, function(eventName)
            SL:Print(eventName)
        end)
        GUI:addChild(GUI:Attach_LeftBottom(), t)
        SL:ScheduleOnce(function()
            GUI:removeChildByID(GUI:Attach_LeftBottom(), "21")
        end, 3)

        `
    },
    {
        "label": "ShowWorldTips",
        "insertText": dedent`
        GUI:ShowWorldTips(\${1:tips}, \${2:worldPos}, \${3:anchorPoint})
        `,
        "documentation": dedent`# 显示文本Tips
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数        | 必选 | 类型   | 注释     |
        | :---------- | :--- | :----- | :------- |
        | tips        | 是   | string | 显示文本 |
        | worldPos    | 是   | table  | 世界坐标 |
        | anchorPoint | 是   | table  | 锚点     |

        示例:
        GUI:ShowWorldTips("测试", GUI:p(400, 400), GUI:p(0, 0))

        `
    },
    {
        "label": "HideWorldTips",
        "insertText": dedent`
        GUI:HideWorldTips()
        `,
        "documentation": dedent`# 关闭文本Tips
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        `
    },
    {
        "label": "UserUILayout",
        "insertText": dedent`
        GUI:UserUILayout(\${1:pNode}, \${2:param})
        `,
        "documentation": dedent`# 自适应布局
        [在线文档](http://engine-doc.996m2.com/web/#/22/3649)

        | 参数  | 必选 | 类型  | 注释     |
        | :---- | :--- | :---- | :------- |
        | pNode | 是   | obj   | 控件对象 |
        | param | 是   | table | 布局参数 |

        - 返回值 : table {width = width, height = height}
        布局参数说明
        param = {
                dir： 1：垂直; 2: 水平; 3： 两者
                gap:  x: 左右间距; y: 上下间距; l: 左边距; t: 上边距
                addDir: 动画增长方式 1: 从上到下（从左到右）（多行从左上角）, 2：中间到两边（多行从右上角）, 3：从下到上（从右到左）
                colnum: 多行列数（dir必须是3）
                autosize: 根据内容自适应容器
                sortfunc: 排序函数
                interval：增长方式动画播放时间间隔, 不传值则不播放动画
                rownums ： 每一行的数量table ; 例如：rownums = {3, 2} （第一行3个元素，第二行2个元素）
        }
            示例代码
            local Layout = GUI:Layout_Create(parent, "Layout", 50,50, 500.00, 200.00, false)
            GUI:Layout_setBackGroundColorType(Layout, 1)
            GUI:Layout_setBackGroundColor(Layout, "#96c8ff")
            GUI:Layout_setBackGroundColorOpacity(Layout, 140)
            local Button_1 = GUI:Button_Create(Layout, "button_1", 100.00, 0.00, "res/public/1900000660.png")
            GUI:Win_SetParam(Button_1, 1)
            GUI:Button_setTitleText(Button_1, "button_1")
            local Button_2 = GUI:Button_Create(Layout, "button_2", 200.00, 0.00, "res/public/1900000660.png")
            GUI:Win_SetParam(Button_2, 2)
            GUI:Button_setTitleText(Button_2, "button_2")
            local Button_3 = GUI:Button_Create(Layout, "button_3", 300.00, 100.00, "res/public/1900000660.png")
            GUI:Win_SetParam(Button_3, 2)
            GUI:Button_setTitleText(Button_3, "button_3")

            GUI:UserUILayout(Layout, {
                dir=2,
                addDir=2,
                interval=1,
                gap = {x=1},
                sortfunc = function (lists)
                    table.sort(lists, function (a, b)
                        return GUI:Win_GetParam(a) > GUI:Win_GetParam(b)
                    end)
                end
            })
        `
    }
]



export function getCompletionItems(): vscode.CompletionItem[] {


    const completionItems: vscode.CompletionItem[] = [];
    funItems.forEach((item: any) => {
        completionItems.push(createFunctionCompletionItem(item.label, item.insertText, item.documentation));
    });
    return completionItems;
}

function createFunctionCompletionItem(label: string, insertText: string, documentation?: string): vscode.CompletionItem {
    const item = new vscode.CompletionItem(label, vscode.CompletionItemKind.Function);
    item.insertText = new vscode.SnippetString(insertText);
    if (documentation) {
        item.documentation = new vscode.MarkdownString(documentation);
    }
    return item;
}
